void main() {
  // 1. 使用泛型限定List中元素的类型
  List categories = ['居家', '美食', 100, true];
  print(categories);
    // 1.1 让列表中的元素只能是字符串类型
  List<String> categorie = ['居家', '美食'];
  // 有泛型的约束,不能添加String 以外的类型
  print(categorie);

  // 1.2 让列表中的元素只能是数字类型
  List<num> nums = [100, 89, 10.99];
  print(nums);

  // 2. 使用泛型限定Map中键和值的类型
  
  // 2.1 键和值都可以是任意类型
  // 字典泛型,注意dart 不支持联合类型,两种类型意思需用 dynamic 表示
  Map categories1 = {
      1: 2,
      true: false,
      'name': '张三', 
      'id': 1
      };
  print(categories1);

  // 2.2 键和值都只能是字符串类型
  // dart  不支持联合类型
  Map<String, String> categories2 = {
    'id': '1',
    'name': '居家',
  };
  print(categories2);

  // 2.3 键字符串类型, 值是任意类型
  Map<String, dynamic> categories3 = {
    'id': 1,
     'name': '居家', 
     'isMan': true
     };
  print(categories3);


  // 类型
  // 调用函数,传入不同类型
    var a =  demo<int>(1);
  // var a =  demo(1);
  var b = demo<String>('1');
  var c = demo<bool>(true);
// 有了泛型的约束,函数返回值明确,调用有代码提示和类型检查
  print(a.toDouble());
  print(b);
  print(c);
}

// 函数参数和返回值没有指定类型,书写不会报错,但是运行时存在风险
//  demo(value){
//   return value;
// }
// demo<T> 声明
// 通过泛型参数   可确定  参数类型   返回值的类型
 T demo<T>(T value){
  return value;
}